//封装一个通用柯里化工具函数(面试手写代码)
/**
 * @description: 将函数柯里化的工具函数
 * @param {Function} fn 待柯里化的函数
 * @param {array} args 已经接收的参数列表
 * @return {Function}
 */
 const currying = function(fn, ...args) {
    // fn需要的参数个数
    const len = fn.length
    // 返回一个函数接收剩余参数
    return function (...params) {
        // 拼接已经接收和新接收的参数列表
        let _args = [...args, ...params]
        // 如果已经接收的参数个数还不够，继续返回一个新函数接收剩余参数
        if (_args.length < len) {
            return currying.call(this, fn, ..._args)
        }
       // 参数全部接收完调用原函数
        return fn.apply(this, _args)
    }
}





// 普通的add函数
// function add(x, y) {
//     return x + y
// }

// // Currying后
// function curryingAdd(x) {
// 	return function(y){
// 		return x + y;
// 	}
// }

// console.log(add(1, 2));          //3
// console.log(curryingAdd(1)(2));  //3


// 接收一个单一参数
const curryingAdd = function (x) {
    // 并且返回接受余下的参数的函数
    return function (y) {
        return function (z) {
            return x + y + z
        }
    }
}
console.log(curryingAdd(1)(2)(3))



// // 正常正则验证字符串 reg.test(txt)
// function check(reg, txt) {
//     return reg.test(txt)
// }

// console.log(check(/\d+/g, 'test'))       //false
// console.log(check(/[a-z]+/g, 'test'))    //true

// // Currying后
// function curryingCheck(reg) {
// 	return function(txt) {
// 		return reg.test(txt)
// 	}
// }
// var hasNumber = curryingCheck(/\d+/g)
// var hasLetter = curryingCheck(/[a-z]+/g)

// console.log(hasNumber('test1'))      // true
// console.log(hasNumber('testtest'))   // false
// console.log(hasLetter('21212'))      // false